package csu.web.mypetstore.domain;

import csu.web.mypetstore.pojo.DB_Cart;
import csu.web.mypetstore.pojo.Item;
import csu.web.mypetstore.pojo.Product;
import csu.web.mypetstore.service.ItemService;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.*;

public class Cart implements Serializable {
    private static final long serialVersionUID = 8329559983943337176L;
    private final Map<String, CartItem> itemMap = Collections.synchronizedMap(new HashMap<String, CartItem>());
    private final List<CartItem> itemList = new ArrayList<CartItem>();

    public Iterator<CartItem> getCartItems() {
        return itemList.iterator();
    }

    public List<CartItem> getCartItemList() {
        return itemList;
    }

    public int getNumberOfItems() {
        return itemList.size();
    }

    public Iterator<CartItem> getAllCartItems() {
        return itemList.iterator();
    }

    public boolean containsItemId(String itemId) {
        return itemMap.containsKey(itemId);
    }

    public List<CartItem> getItemList() {
        return itemList;
    }
    public void clear() {
        itemMap.clear();
        itemList.clear();
    }
    public void addItem(Item item, boolean isInStock) {
        CartItem cartItem = (CartItem) itemMap.get(item.getItemid());
        if (cartItem == null) {
            cartItem = new CartItem();
            cartItem.setItem(item);
            cartItem.setQuantity(0);
            cartItem.setInStock(isInStock);
            itemMap.put(item.getItemid(), cartItem);
            itemList.add(cartItem);
        }
        cartItem.incrementQuantity();
    }
    public Item removeItemById(String itemId) {
        CartItem cartItem = (CartItem) itemMap.remove(itemId);
        if (cartItem == null) {
            return null;
        } else {
            itemList.remove(cartItem);
            return cartItem.getItem();
        }
    }
    public void addItemByDBCart(List<DB_Cart>carts, ItemService itemService)
    {

        for(DB_Cart cart:carts)
        {
            Item item=itemService.getItem(cart.getItemId());
            CartItem cartItem = new CartItem();
            cartItem.setItem(item);
            cartItem.setQuantity(cart.getQuanitity());
            cartItem.setInStock(true);

            itemMap.put(item.getItemid(), cartItem);
            itemList.add(cartItem);

        }
    }


    public void incrementQuantityByItemId(String itemId) {
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        cartItem.incrementQuantity();
    }
    public int getQuantityByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        return cartItem.getQuantity();
    }

    public void setQuantityByItemId(String itemId, int quantity) {
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        cartItem.setQuantity(quantity);
    }
    public String getProductIdByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        Item item=cartItem.getItem();
        Product product= item.getProduct();
        return product.getProductid();
    }
    public String getDecriptionByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        Item item=cartItem.getItem();
        Product product= item.getProduct();
        return item.getAttr1()+" "+product.getName();
    }
    public BigDecimal getPriceByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        Item item=cartItem.getItem();
        return BigDecimal.valueOf(item.getListprice());
    }
    public BigDecimal getLinePriceByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        Item item=cartItem.getItem();
        BigDecimal quanitity=new BigDecimal(0);
        int value=item.getQuantity();
        quanitity=BigDecimal.valueOf((int)value);
        return BigDecimal.valueOf(item.getListprice()).multiply(quanitity);
    }
    public BigDecimal getSubTotal() {
        BigDecimal subTotal = BigDecimal.ZERO;
        Iterator<CartItem> items = getAllCartItems();
        while (items.hasNext()) {
            CartItem cartItem = (CartItem) items.next();
            Item item = cartItem.getItem();

            // 检查 item 和 listPrice 是否为 null
            if (item != null && item.getListprice() != null) {
                BigDecimal listPrice = BigDecimal.valueOf(item.getListprice());
                BigDecimal quantity = BigDecimal.valueOf(cartItem.getQuantity());
                subTotal = subTotal.add(listPrice.multiply(quantity));
            }
        }
        return subTotal;
    }
    public CartItem getItemByItemId(String itemId){
        CartItem cartItem = (CartItem) itemMap.get(itemId);
        return cartItem;
    }
}
